<?php

/**
 *
 * Controlleur pour la section prix et produits
 * Gestion des produits, des types, des best-sellers et des rapports de vente.
 * @author Théo Chamley
 *
 */

class PrixproduitController extends CodeBar_AbstractController {

	/**
	 * (non-PHPdoc)
	 * @see trunk/library/Zend/Controller/Zend_Controller_Action::init()
	 */
	public function init()
	{
		CodeBar_AbstractController::init();
		$this->view->headTitle("Prix & produits");
		if(!($this->session()->user->connected))
		{
			$this->_helper->redirector('index','index');
		}
		$r = $this->session()->user->getRoles();
		$isAdmin = false;
		foreach ($r as $role) {
			$isAdmin = $isAdmin || ($role->getName() == 'AdminGroupe');
		}
		if($this->session()->permissionactive != "PrixProduit" || !$isAdmin)
		{
			$this->_helper->redirector('modulechoice','index');
		}
	}

	/**
	 *
	 * Liste des sous-sections disponibles
	 */
	public function indexAction() {
		/*
		 * CSS
		 */
		$this->view->headLink()->appendStylesheet('/css/site.css');

		/*
		 * JS
		 */
		$this->view->headScript()->appendFile('/js/Escape.js','text/javascript');


		$this->view->link = '/prixproduit/gestionproduit';
		$this->view->link2 = '/prixproduit/gestiontypeproduit';
		$this->view->link3 = '/prixproduit/bestsellers';
		$this->view->link4 = '/prixproduit/rapport';
	}

	/**
	 *
	 * Gestion des produit
	 */
	public function gestionproduitAction() {
		$this->view->headTitle("Produits");
		/*
		 * CSS
		 */
		$this->view->headLink()->appendStylesheet('/css/stylesheet_gestionproduit.css');

		/*
		 * JS
		 */
		$this->view->headScript()->appendFile('/js/EscapePrixProduit.js','text/javascript');

		$this->view->titre = '<tr>
			<td class = "nomProduit prod_column">
				Nom de produit
			<td class = "quantiteProduit prod_column">
				Quantité
			<td class = "typeProduit prod_column">
				Type
			<td class = "codeBarresProduit prod_column">
				CodeBar
			<td class = "prixCB prod_column">
				Prix CB
			<td class = "prixEspece prod_column">
				Prix espèce
			<td class = "prixSpecial prod_column">
				Prix spécial
			<td class = "suppression prod_column">
				Suppr.</tr>';

		$form = new Application_Form_PrixProduit_GestionProduitForm();
		if($this->getRequest()->isPost())
		{
			$formData = $this->getRequest()->getPost();
			if($form->isValid($formData))
			{
				$groupe = $this->session()->user->getGroupeActif();
				$produits = $groupe->getProduits();//récupération des anciens produits
				$db_type_prix = new Application_Model_TypePrixTable();
				$rows_type_prix = $db_type_prix->fetchAll($db_type_prix->select());
				//création des nouvelles versions des produits
				foreach($produits as $produit)
				{
					if(!($form->getElement('suppr'.$produit->getIdProduit())->isChecked()))//on vérifie que le produit n'est pas prévu pour suppression
					{
						if($form->getValue('prixCB'.$produit->getIdProduit()) != NULL)//on vérifie qu'un prix CB est bien entré
						{
							$new_produit = new Application_Model_Produit();
							$new_produit->setIdProduit($produit->getIdProduit());
							$new_produit->setIdGroupe($produit->getIdGroupe());
							$new_produit->setName($form->getValue('nomProduit'.$new_produit->getIdProduit()));
							$new_produit->setQuantite($form->getValue('quantiteProduit'.$new_produit->getIdProduit()));
							$new_produit->setIdType($form->getValue('typeProduit'.$new_produit->getIdProduit()));
							$new_produit->setCodeBarres($form->getValue('codeBarresProduit'.$new_produit->getIdProduit()));
							$new_produit->update();//on update le produit avec les nouvelles valeurs
							foreach($rows_type_prix as $r)//pour chaque type de prix, on met à  jour le prix du produit
							{
								$prix = new Application_Model_Prix();
								$prix->setIdProduit($produit->getIdProduit());
								$prix->setIdTypePrix($r['id_type_prix']);
								if($form->getValue('prix'.$r['nom'].$produit->getIdProduit()) >= 0)//cas normal
								{
									$prix->setPrix($form->getValue('prix'.$r['nom'].$produit->getIdProduit()));
								}
								else//dans le cas oà¹ un prix n'ait pas été donné pour ce produit et ce type de prix. cela n'arrive normalement pas
								{
									$prix->setPrix(0);//dans ce cas on lui attribue le prix 0
								}
								$prix->update();//on met à  jour les prix
							}
						}
						else
						{
							$this->view->error = "Il faut au moins rentrer le prix CodeBar pour un produit. Les modifications n'ont pas été enregistrées.";//si un prix CB n'est pas rentré
						}
					}
					else//si le produit a été prévu pour suppression
					{
						$produit->delete();//ben on le supprime
					}
				}
				if($form->getValue('nomNouveauProduit') != NULL)//l'utilisateur veut-il créer un nouveau produit ?
				{
					if($form->getValue('prixCBNouveau') != NULL)//si oui, a-t-il bien rentré un prix CB ?
					{
						$nouveau_produit = new Application_Model_Produit();
						$nouveau_produit->setName($form->getValue('nomNouveauProduit'));
						$nouveau_produit->setIdGroupe($groupe->getId());
						if($form->getValue('quantiteNouveauProduit') != NULL)
						{
							$nouveau_produit->setQuantite($form->getValue('quantiteNouveauProduit'));
						}
						else
						{
							$nouveau_produit->setQuantite(0);
						}
						$nouveau_produit->setIdType($form->getValue('typeNouveauProduit'));
						$nouveau_produit->setCodeBarres($form->getValue('codeBarresNouveauProduit'));
						$nouveau_produit->save();//on enregistre le nouveau produit
						foreach($rows_type_prix as $r2)//pour chaque type de prix
						{
							if($form->getValue('prix'.$r2['nom'].'Nouveau') != NULL)
							{
								if($form->getValue('prix'.$r2['nom'].'Nouveau') >= 0)//si le prix du nouveau produit a été défini pour ce type de prix alors...
								{
									$prix = new Application_Model_Prix();
									$prix->setIdProduit($nouveau_produit->getIdProduit());
									$prix->setIdTypePrix($r2['id_type_prix']);
									$prix->setPrix($form->getValue('prix'.$r2['nom'].'Nouveau'));
									$prix->save();//on l'enregistre
								}
								else//sinon on lui attribue le prix CB
								{
									$prix = new Application_Model_Prix();
									$prix->setIdProduit($nouveau_produit->getIdProduit());
									$prix->setIdTypePrix($r2['id_type_prix']);
									$prix->setPrix(0);
									$prix->save();//et on l'enregistre
								}
							}
							else//sinon on lui attribue le prix CB
							{
								$prix = new Application_Model_Prix();
								$prix->setIdProduit($nouveau_produit->getIdProduit());
								$prix->setIdTypePrix($r2['id_type_prix']);
								$prix->setPrix(0);
								$prix->save();//et on l'enregistre
							}
						}
					}
					else
					{
						$this->view->error = "Il faut au moins rentrer le prix CodeBar pour un nouveau produit. Le nouveau produit n'a pas été enregistré.";
					}
				}
			}
			$this->session()->user->getGroupeActif()->getInfosProduits();
			$this->redirect();
		}
		$form = new Application_Form_PrixProduit_GestionProduitForm();//on refait le form pour prendre en compte les changements faits sur la BDD
		$this->view->form = $form;
	}

	/**
	 *
	 * Gestion des types de produits (dossiers dans l'interface de vente)
	 */
	public function gestiontypeproduitAction() {
		$this->view->headTitle("Catégories");
		/*
		 * CSS
		 */
		$this->view->headLink()->appendStylesheet('/css/stylesheet_gestiontypeproduit.css');
		$this->view->headLink()->appendStylesheet('/css/main/main.css');

		/*
		 * JS
		 */
		$this->view->headScript()->appendFile('/js/EscapePrixProduit.js','text/javascript');
		$this->view->headScript()->appendFile('/js/disable.js','text/javascript');

		$form = new Application_Form_PrixProduit_GestionTypeProduitForm();
		$db_type_produit = new Application_Model_TypeProduitTable();
		$liste_type_produit = $db_type_produit->fetchAll($db_type_produit->select());
		$db_produits = new Application_Model_ProduitsTable();
		foreach($liste_type_produit as $type_produit)//pour chaque type de produit
		{
			$r = $db_produits->fetchAll($db_produits->select()->where('id_type = ?',$type_produit['id_type']));//on récupère les produits de ce type
			if(count($r)>0)//s'il en existe alors on ne peut pas supprimer ce type de produit et on désactive la checkbox
			{
				echo "<script language=\"javascript\">";
				echo "Disabled('suppr".$type_produit['nom_type']."')";
				echo "</script>";
			}
		}
		if($this->getRequest()->isPost())
		{
			$formData = $this->getRequest()->getPost();
			if($form->isValid($formData))
			{
				foreach($liste_type_produit as $type_produit)//pour chaque type de produit
				{
					if($form->getElement('suppr'.str_replace(' ','',$type_produit['nom_type']))->isChecked())//si le type est sélectionné pour la suppression
					{
						$db_type_produit->delete(array('id_type = ?' => $type_produit['id_type']));//on le supprime
						//inscription dans l'historique
						$libelle = "Suppression d'un type de produit : ".$type_produit['nom_type'];
						$histo = new Application_Model_HistoSystemElement($libelle);
						$histo->AddToHistoSystem();
						//fin historique
					}
				}
				if($form->getValue('nomNouveauType') != NULL)//si l'utilisateur veut rentrer un nouveau type de produit
				{
					$db_type_produit->insert(array('nom_type' => $form->getValue('nomNouveauType')));//on le crée
					//inscription dans l'historique
					$libelle = "Ajout d'un type de produit : ".$form->getValue('nomNouveauType');
					$histo = new Application_Model_HistoSystemElement($libelle);
					$histo->AddToHistoSystem();
					//fin historique
				}
			}
			$this->redirect();
		}
		$form = new Application_Form_PrixProduit_GestionTypeProduitForm();//on recrée le form pour prendre en compte les mises à  jours de la BDD
		$this->view->form = $form;
	}

	/**
	 *
	 * Gestion des best-sellers
	 */
	public function bestsellersAction() {
		$this->view->headTitle("Best sellers");
		/*
		 * CSS
		 */
		$this->view->headLink()->appendStylesheet('/css/stylesheet_bestsellers.css');
		$this->view->headLink()->appendStylesheet('/css/main/main.css');

		/*
		 * JS
		 */
		$this->view->headScript()->appendFile('/js/disable.js','text/javascript');
		$this->view->headScript()->appendFile('/js/EscapePrixProduit.js','text/javascript');

		$form = new Application_Form_PrixProduit_BestSellersForm();
		$this->view->form = $form;

		if($this->getRequest()->isPost())
		{
			$formData = $this->getRequest()->getPost();
			if($form->isValid($formData))
			{
				$groupe = $this->session()->user->getGroupeActif();
				if(!($form->getElement('auto')->isChecked()))
				{
					$groupe->setListeBS($form->getValue('BS1'),$form->getValue('BS2'),$form->getValue('BS3'));
					$groupe->saveListeBS();
					$groupe->setBSAuto(false)->saveBSAuto();
				}
				else
				{
					$groupe->setListeBSAuto();
					$groupe->saveListeBS();
					$groupe->setBSAuto(true)->saveBSAuto();
				}
			}
			$this->redirect();
		}

		$form = new Application_Form_PrixProduit_BestSellersForm();
		$this->view->form = $form;
		if($form->getElement('auto')->isChecked())
		{
			echo "<script language=\"javascript\">";
			echo "Disabled('BS1');Disabled('BS2');Disabled('BS3')";
			echo "</script>";
		}
	}

	/**
	 *
	 * Rapports de vente
	 */
	public function rapportAction() {
		$this->view->headTitle("Rapports");
		$this->jQueryUIEnable();
		/*
		 * CSS
		 */
		$this->view->headLink()->appendStylesheet('/css/stylesheet_rapport.css');
		$this->view->headLink()->appendStylesheet('/css/histo_table.css');

		/*
		 * JS
		 */
		$this->view->headScript()->appendFile('/js/jquery.ui.datepicker-fr.js','text/javascript');
		$this->view->headScript()->appendFile('/js/jquery.dataTables.min.js','text/javascript');
		$this->view->headScript()->appendFile('/js/rapport.js','text/javascript');
		$this->view->headScript()->appendFile('/js/EscapePrixProduit.js','text/javascript');

		$form = new Application_Form_PrixProduit_RapportForm();
		$this->view->form = $form;

		$tab = '<table>';

		$groupe = $this->session()->user->getGroupeActif();

		if($this->getRequest()->isPost())
		{
			$formData = $this->getRequest()->getPost();
			if($form->isValid($formData))
			{
				$tab = $tab.'<tr><th>Produit</th><th>Nombre de ventes</th><th>Total Espèces</th><th>Total CodeBar</th><th>Total</th></tr>';

				//On récupère les dates de début et de fin de rapport
				$date1=$form->getValue('date1');
				$date1 = substr($date1,6,4).'-'.substr($date1,3,2).'-'.substr($date1,0,2).' 00:00:00';
				$date2=$form->getValue('date2');
				$date2 = substr($date2,6,4).'-'.substr($date2,3,2).'-'.substr($date2,0,2).' 23:59:59';

				$montant_espece = 0;
				$montant_codebar = 0;
				$nbr_produits_vendus_total = 0;

				//On récupère toutes les ventes du groupe
				//On les trie par produit : sortByProduct renvoie un array dans lequel chaque élément est la liste des items d'historique
				// pour un produit particulier (qu'il est été supprimé ou pas)
				$ventes_groupe = Application_Model_HistoVenteElement::getByGroupBetweenDate($groupe,$date1,$date2);
				$ventes_by_product = Application_Model_HistoVenteElement::sortByProduct($ventes_groupe);

				try
				{
					foreach($ventes_by_product as $ventes_produit)
					{
						$ventes_produit_espece = Application_Model_HistoVenteElement::especes($ventes_produit);
						$ventes_produit_codebar = Application_Model_HistoVenteElement::codebar($ventes_produit);

						$montant_produit_espece = Application_Model_HistoVenteElement::somme($ventes_produit_espece);
						$montant_produit_codebar = Application_Model_HistoVenteElement::somme($ventes_produit_codebar);
						$montant_produit_total = $montant_produit_espece + $montant_produit_codebar;
						$nbr_produit_vendu = Application_Model_HistoVenteElement::nbr_produits_vendus($ventes_produit);

						//On récupère le produit en tant que tel
						//Il se peut que le produit ait été supprimé : on lui donne un nom générique
						$produit = new Application_Model_Produit();
						try
						{
							$produit->getById($ventes_produit[0]->getProduit());
						}
						catch (Zend_Exception $e)
						{
							$produit->setName("N/A ID ".$ventes_produit[0]->getProduit());
						}

						$tab = $tab.'<tr><td>'.$produit->getName().'</td><td>'.$nbr_produit_vendu.'</td><td>'.$montant_produit_espece.'€</td><td>'.$montant_produit_codebar.'€</td><td>'.$montant_produit_total.'€</td></tr>';

						$montant_espece = $montant_espece + $montant_produit_espece;
						$montant_codebar = $montant_codebar + $montant_produit_codebar;
						$nbr_produits_vendus_total = $nbr_produits_vendus_total + $nbr_produit_vendu;
					}
					$montant_total = $montant_espece + $montant_codebar;
					$tab = $tab.'<tr><td>Nombre total de produits vendus</td><td>'.$nbr_produits_vendus_total.'</td></tr>';
					$tab = $tab.'<tr><td>Montant Espèce</td><td>'.$montant_espece.'€</td></tr>';
					$tab = $tab.'<tr><td>Montant CodeBar</td><td>'.$montant_codebar.'€</td></tr>';
					$tab = $tab.'<tr><td>Montant total</td><td>'.$montant_total.'€</td></tr>';
				}
				catch(ZendException $e)
				{
					$this->view->error = $e->getMessage();
				}
			}
		}

		$tab = $tab.'</table>';
		$this->view->tab = $tab;
	}
}
